summaryrefslogtreecommitdiffstats
path: root/src/hid_core/resources/touch_screen/touch_types.h
blob: 97ee847da4c0af4b6337fa6f18b5185f6a454ebd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include <array>

#include <array>
#include "common/bit_field.h"
#include "common/common_funcs.h"
#include "common/common_types.h"
#include "common/point.h"
#include "hid_core/hid_types.h"

namespace Service::HID {
static constexpr std::size_t MAX_FINGERS = 16;
static constexpr size_t MAX_POINTS = 4;

// This is nn::hid::GestureType
enum class GestureType : u32 {
    Idle,     // Nothing touching the screen
    Complete, // Set at the end of a touch event
    Cancel,   // Set when the number of fingers change
    Touch,    // A finger just touched the screen
    Press,    // Set if last type is touch and the finger hasn't moved
    Tap,      // Fast press then release
    Pan,      // All points moving together across the screen
    Swipe,    // Fast press movement and release of a single point
    Pinch,    // All points moving away/closer to the midpoint
    Rotate,   // All points rotating from the midpoint
};

// This is nn::hid::GestureDirection
enum class GestureDirection : u32 {
    None,
    Left,
    Up,
    Right,
    Down,
};

// This is nn::hid::GestureAttribute
struct GestureAttribute {
    union {
        u32 raw{};

        BitField<4, 1, u32> is_new_touch;
        BitField<8, 1, u32> is_double_tap;
    };
};
static_assert(sizeof(GestureAttribute) == 4, "GestureAttribute is an invalid size");

// This is nn::hid::GestureState
struct GestureState {
    s64 sampling_number{};
    s64 detection_count{};
    GestureType type{GestureType::Idle};
    GestureDirection direction{GestureDirection::None};
    Common::Point<s32> pos{};
    Common::Point<s32> delta{};
    f32 vel_x{};
    f32 vel_y{};
    GestureAttribute attributes{};
    f32 scale{};
    f32 rotation_angle{};
    s32 point_count{};
    std::array<Common::Point<s32>, 4> points{};
};
static_assert(sizeof(GestureState) == 0x60, "GestureState is an invalid size");

struct GestureProperties {
    std::array<Common::Point<s32>, MAX_POINTS> points{};
    std::size_t active_points{};
    Common::Point<s32> mid_point{};
    s64 detection_count{};
    u64 delta_time{};
    f32 average_distance{};
    f32 angle{};
};

// This is nn::hid::TouchScreenState
struct TouchScreenState {
    s64 sampling_number{};
    s32 entry_count{};
    INSERT_PADDING_BYTES(4); // Reserved
    std::array<Core::HID::TouchState, MAX_FINGERS> states{};
};
static_assert(sizeof(TouchScreenState) == 0x290, "TouchScreenState is an invalid size");

} // namespace Service::HID